package com.zjl.legendary.util;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Map;

/**
 * @author zhoujingluo
 * @date 2021/5/26 12:35
 */
public class BeanUtils {
    public static <T> T parseBean(HttpServletRequest req, Class<T> clazz){
        try {
            //通过反射机制创建对象
            T obj = clazz.newInstance();
            //收参，将接收到的参数放入Map集合中
            Map<String, String[]> pMap = req.getParameterMap();
            //依次获取Map集合中键的值（即参数名）
            // 这里要求前端页面传入的参数值要与对象属性名一一对应
            for (String p : pMap.keySet()) {
                //通过反射根据属性名获取属性对象
                Field field = null;
                //在此处处理字段找不到时产生的异常，避免其他参数的影响而导致程序执行失败
                try {
                    field = clazz.getDeclaredField(p);
                } catch (NoSuchFieldException e) {
                    System.err.println("\""+p+"\""+"字段不存在");
                }
                //要求获得的属性对象不为空才能进行下一步操作
                if (field != null){
                    //设置忽略访问校验
                    field.setAccessible(true);
                    //从前端页面传递的都是字符串类型的值，添加判断防止出现类型不匹配异常
                    if (field.getGenericType().getTypeName().equals("java.lang.Integer")){
                        field.set(obj,Integer.valueOf(pMap.get(p)[0]));
                    } else {
                        field.set(obj,pMap.get(p)[0]);
                    }
                }
            }
            return obj;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return null;
    }

}
